package com.itsm.example.audit.pojo.state;

import com.itsm.example.statemachine.bo.ItsmState;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.SneakyThrows;

import java.util.EnumSet;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author benym
 * @date 2023/7/12 16:03
 */
@Data
public class AuditState extends ItsmState {

//    /**
//     * 已申请
//     */
//    APPLY("APPLY", "已申请"),
//    /**
//     * 爸爸同意
//     */
//    DAD_PASS("DAD_PASS", "爸爸同意"),
//    /**
//     * 妈妈同意
//     */
//    MOM_PASS("MOM_PASS", "妈妈同意"),
//    /**
//     * 爸爸不同意
//     */
//    DAD_REJ("DAD_REJ", "爸爸不同意"),
//    /**
//     * 妈妈不同意
//     */
//    MOM_REJ("MOM_REJ", "妈妈不同意"),
//    /**
//     * 已完成
//     */
//    DONE("DONE", "已完成");

    /**
     * 初始状态
     */
    public static  AuditState APPLY = new AuditState(10, "已申请");
    public static  AuditState DAD_PASS = new AuditState(20, "爸爸同意");
    public static  AuditState MOM_PASS = new AuditState(30, "妈妈同意");
    public static  AuditState DAD_REJ = new AuditState(40, "爸爸不同意");
    public static  AuditState MOM_REJ = new AuditState(50, "妈妈不同意");
    public static  AuditState DONE = new AuditState(60, "已完成");

    private static final Map<Integer, AuditState> STATE_MAP = new ConcurrentHashMap<>();
    static {
        STATE_MAP.put(APPLY.getValue(), APPLY);
        STATE_MAP.put(DAD_PASS.getValue(), DAD_PASS);
        STATE_MAP.put(MOM_PASS.getValue(), MOM_PASS);
        STATE_MAP.put(DAD_REJ.getValue(), DAD_REJ);
        STATE_MAP.put(MOM_REJ.getValue(), MOM_REJ);
        STATE_MAP.put(DONE.getValue(), DONE);
    }
    @SneakyThrows
    public static AuditState getState(Integer code) {
        if(STATE_MAP.containsKey(code))
            return STATE_MAP.get(code);
        else
            throw new Exception("未找到对应状态");

    }

    AuditState(Integer value, String desc) {
        super.setValue(value);
        super.setName(desc);
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        AuditState s = (AuditState) o;
        return Objects.equals(getValue(), s.getValue());
    }
    @Override
    public int hashCode() {
        return Objects.hash(getValue());
    }
    @Override
    public String toString() {
        return Objects.toString(this.getValue());
    }
}
